package cn.micro.eye.commons.validate;

/**
 * The Enum Parent
 *
 * @author lry
 */
public interface IEnum {

    /**
     * The get value
     *
     * @return value
     */
    int getValue();

    /**
     * The get title
     *
     * @return title
     */
    String getTitle();

    /**
     * The get enum object
     *
     * @param clz   {@link Class<T>}
     * @param value Enum value
     * @param <T>   {@link T extends IEnum}
     * @return {@link T extends IEnum}
     */
    static <T extends IEnum> T getEnum(Class<T> clz, Integer value) {
        if (clz == null || value == null) {
            return null;
        }

        for (T t : clz.getEnumConstants()) {
            if (t.getValue() == value) {
                return t;
            }
        }

        throw new IllegalArgumentException("Illegal value");
    }

    /**
     * The get enum value
     *
     * @param clz   {@link Class<T>}
     * @param value Enum value
     * @param <T>   {@link T extends IEnum}
     * @return {@link T extends IEnum}
     */
    static <T extends IEnum> Integer getEnumValue(Class<T> clz, Integer value) {
        T t = getEnum(clz, value);
        if (t == null) {
            return null;
        }

        return t.getValue();
    }

    /**
     * The get enum title
     *
     * @param clz   {@link Class<T>}
     * @param value Enum value
     * @param <T>   {@link T extends IEnum}
     * @return {@link T extends IEnum}
     */
    static <T extends IEnum> String getEnumTitle(Class<T> clz, Integer value) {
        T t = getEnum(clz, value);
        if (t == null) {
            return null;
        }

        return t.getTitle();
    }

}
